/**
 * 
 */
package edu.erpan.bl.bean.administracion;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Stateful;
import javax.persistence.Query;

import edu.erpan.bl.entities.administracion.Modulo;
import edu.erpan.bl.entities.administracion.Rol;
import edu.erpan.util.entityManager.GenericEntityManager;
import edu.erpan.util.entityManager.exceptions.PersistException;
import edu.erpan.util.entityManager.exceptions.QueryException;

/**
 * Permite admisnitrar la informacion de los roles de los usuarios
 * 
 * @author Jeison
 * @param <T>
 * @date 13/03/2013
 *
 */
@Stateful
@LocalBean
public class AdministracionInterfazUsuarioBean  extends GenericEntityManager<Rol> implements AdministracionInterfazUsuarioBeanRemote {

	
	public AdministracionInterfazUsuarioBean() {
		super(Rol.class);
		// TODO Auto-generated constructor stub
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Rol> consultarRoles() throws QueryException {
		List<Rol> roles=new ArrayList<Rol>(0);
		StringBuffer stringQuery=new StringBuffer("SELECT rol from ")
			.append(Rol.class.getName())
			.append(" rol ");
	
		try{
			Query query=getEntityManager().createQuery(stringQuery.toString());
			roles=query.getResultList();
		}catch (Exception e) {
			throw new QueryException(e);
		}
		
		return roles;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Modulo> consultarModulos() throws QueryException {
		List<Modulo> modulos=new ArrayList<Modulo>(0);
		StringBuffer stringQuery=new StringBuffer("SELECT modulo from ")
			.append(Modulo.class.getName())
			.append(" modulo ")
			.append("ORDER BY modulo.orden ");
	
		try{
			Query query=getEntityManager().createQuery(stringQuery.toString());
			modulos=query.getResultList();
		}catch (Exception e) {
			throw new QueryException(e);
		}
		
		return modulos;
	}

	@SuppressWarnings("unchecked")
	@Override
	public Rol consultarRol(Rol rol) throws QueryException {
		StringBuffer stringQuery=new StringBuffer("SELECT rol from ")
			.append(Rol.class.getName())
			.append(" rol ");
		StringBuffer where=new StringBuffer("WHERE ");
	
		int contadorCondiciones=0;
		if(rol.getNombre()!=null){
			contadorCondiciones++;
			where.append("rol.nombre like :nombre ");
		}
		
		if(rol.getIdrol()>0){
			if(contadorCondiciones>0){
				where.append("AND ");
			}
			
			contadorCondiciones++;
			
			where.append("rol.idrol = :idRol ");
		}
		Rol rolRetorno=null;
		try{
			
			if(contadorCondiciones>0){
				stringQuery.append(where);
			}
			
			Query query=getEntityManager().createQuery(stringQuery.toString());
		
			if(rol.getNombre()!=null){
				query.setParameter("nombre", rol.getNombre().trim());
			}
			
			if(rol.getIdrol()>0){
				query.setParameter("idRol", rol.getIdrol());
			}
			
			List<Rol> roles=query.getResultList();
			
			if(roles!=null&&!roles.isEmpty()){
				rolRetorno=roles.get(0);
			}
		}catch (Exception e) {
			throw new QueryException(e);
		}
		
		return rolRetorno;
	}

	@SuppressWarnings("unchecked")
	@Override
	public Modulo consultarModulo(Modulo modulo) throws QueryException {
		StringBuffer stringQuery=new StringBuffer("SELECT modulo from ")
			.append(Modulo.class.getName())
			.append(" modulo ");
		StringBuffer where=new StringBuffer("WHERE ");
	
		int contadorCondiciones=0;
		if(modulo.getNombre()!=null){
			contadorCondiciones++;
			where.append("modulo.nombre like :nombre ");
		}
		
		if(modulo.getIdmodulo()>0){
			if(contadorCondiciones>0){
				where.append("AND ");
			}
			
			contadorCondiciones++;
			
			where.append("modulo.idmodulo = :idModulo ");
		}
		Modulo moduloRetornor=null;
		try{
			
			if(contadorCondiciones>0){
				stringQuery.append(where);
			}
			
			Query query=getEntityManager().createQuery(stringQuery.toString());
		
			if(modulo.getNombre()!=null){
				query.setParameter("nombre", modulo.getNombre().trim());
			}
			
			if(modulo.getIdmodulo()>0){
				query.setParameter("idModulo", modulo.getIdmodulo());
			}
			
			List<Modulo> modulos=query.getResultList();
			
			if(modulos!=null&&!modulos.isEmpty()){
				moduloRetornor=modulos.get(0);
			}
		}catch (Exception e) {
			throw new QueryException(e);
		}
		
		return moduloRetornor;
	}

	@Override
	public void guardarRol(Rol rol) throws PersistException {
		this.saveEntity(rol);
	}

	@Override
	public void editarRol(Rol rol) throws QueryException {
		this.mergeEntity(rol);
	}

	@Override
	public void guardarModulo(Modulo modulo) throws PersistException {
		try{
			this.getEntityManager().persist(modulo);
		}catch (Exception e) {
			throw new PersistException(e);
		}
	}

	@Override
	public void editarModulo(Modulo modulo) throws PersistException {
		try{
			this.getEntityManager().merge(modulo);
		}catch (Exception e) {
			throw new PersistException(e);
		}
	}

}
